using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Xml.Linq;
namespace Entidades
{
    public class Recomendacion
    {
        private const string __ErrorAlta = "No se pudo dar el alta (Recomendacion), ";
        private const string __ErrorBaja = "No se pudo dar la baja (Recomendacion), ";
        private const string __ErrorModificacion = "No se pudo hacer la modificacion (Recomendacion), ";
        private const string __ErrorTraerUno = "No se pudo Traer Uno (Recomendacion), ";
        private const string __ErrorTraerTodos = "No se pudo Traer Todos (Recomendacion), ";
        private int _Id;
        private int _IdPostulacion;
        private int _IdUsuario;
        private string _Descripcion;

        private DateTime? _Fecha;
        #region "Propiedades"
        public int Id
        {
            get { return _Id; }
            set { _Id = value; }
        }
        public int IdPostulacion
        {
            get { return _IdPostulacion; }
            set { _IdPostulacion = value; }
        }
        public int IdUsuario
        {
            get { return _IdUsuario; }
            set { _IdUsuario = value; }
        }
        public string Descripcion
        {
            get { return _Descripcion; }
            set { _Descripcion = value; }
        }
        public DateTime? Fecha
        {
            get { return _Fecha; }
            set { _Fecha = value; }
        }
        #endregion
        #region "Lazys"
        private Postulacion _Postulacion;
        public Postulacion Postulacion
        {
            get
            {
                if (_Postulacion == null)
                {
                    _Postulacion = new Postulacion(_IdPostulacion);
                }
                return _Postulacion;
            }
        }
        private Usuario _Usuario;
        public Usuario Usuario
        {
            get
            {
                if (_Usuario == null)
                {
                    _Usuario = new Usuario(_IdUsuario);
                }
                return _Usuario;
            }
        }
        #endregion
        public Recomendacion()
        {
            _Descripcion = "";
        }
        public Recomendacion(int Id)
        {
            Recomendacion recomendacion = traerUno(Id);
            this._Id = recomendacion.Id;
            this._IdPostulacion = recomendacion.IdPostulacion;
            this._IdUsuario = recomendacion.IdUsuario;
            this._Descripcion = recomendacion.Descripcion;
            this._Fecha = recomendacion.Fecha;
        }
        #region "Metodos Publicos"
        public void Alta()
        {
            try
            {
                validaAlta();
                DALRecomendacion.Alta(this);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        public void Baja()
        {
            try
            {
                validaBaja();
                DALRecomendacion.Baja(_Id);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorBaja + ex.Message);
            }
        }
        public void Modificar()
        {
            try
            {
                validaModificacion();
                DALRecomendacion.Modificar(this);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorModificacion + ex.Message);
            }
        }

        public static List<Recomendacion> traerUltimas()
        {
            return DALRecomendacion.traerUltimas();

        }


        #region "Metodos Estaticos"
        private Recomendacion traerUno(int Id)
        {
            try
            {
                return DALRecomendacion.traerUno(Id);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorTraerUno + ex.Message);
            }
        }
        public static List<Recomendacion> TraerTodos()
        {
            try
            {
                return DALRecomendacion.TraerTodos();
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorTraerTodos + ex.Message);
            }
        }
        #region "Lazys"
        public static List<Recomendacion> getAllByIdPostulacion(int IdPostulacion)
        {
            try
            {
                return DALRecomendacion.getAllByIdPostulacion(IdPostulacion);
            }
            catch (Exception ex)
            {
                throw new Exception("ErrorDeLazyLoad(Recomendacion)" + ex.Message);
            }
        }
        public static List<Recomendacion> getAllByIdUsuario(int IdUsuario)
        {
            try
            {
                return DALRecomendacion.getAllByIdUsuario(IdUsuario);
            }
            catch (Exception ex)
            {
                throw new Exception("ErrorDeLazyLoad(Recomendacion)" + ex.Message);
            }
        }

        public static List<Recomendacion> getAllRecibidasByIdUsuario(int IdUsuario)
        {
            try
            {
                return DALRecomendacion.getAllRecibidasByIdUsuario(IdUsuario);
            }
            catch (Exception ex)
            {
                throw new Exception("ErrorDeLazyLoad(Recomendacion)" + ex.Message);
            }
        }
        #endregion
        #endregion
        #endregion
        #region "Metodos Privados"
        private void validaAlta()
        {
            if (_Descripcion == "")
                throw new Exception("la descripcion no debe estar vacia.");

            if (_IdUsuario == 0)
                throw new Exception("Por favor, logueese antes de recomendar.");

        }
        private void validaBaja()
        {
            //lanza excepcion si no valida
            throw new NotImplementedException();
        }
        private void validaModificacion()
        {
            validaAlta();
        }
        #endregion





        
    }
}
